home *** CD-ROM | disk | FTP | other *** search
/ MacWorld Secrets (4th Edition) / Mac Secrets CD 4th Ed.toast / Apple Advanced Technologies / Apple Speech Technologies 1.5 / PlainTalk Developer Info / Speech Recognition Manager SDK / SR Sample Code / Weapons Example / SpeechWeapons.c < prev    next >
C/C++ Source or Header  |  1996-04-11  |  6KB  |  204 lines

  1. #include <SpeechRecognition.h>
  2. #include "string.h"
  3.  
  4.  
  5. #include "SpeechWeapons.h"
  6. #include "Weapons.h"
  7.  
  8. // constants
  9. const long        kWeaponLMRefCon = 'weap';
  10.  
  11. // globals
  12. SRRecognitionSystem    gRecSystem = 0;
  13. SRLanguageModel        gLanguageModel = 0;
  14. SRRecognizer        gRecognizer = 0;
  15.  
  16. // prototypes
  17. Boolean MyHasSpeechRecognitionMgr (void);
  18. pascal OSErr MyHandleSpeechDoneAppleEvent (AppleEvent *theAEevt, AppleEvent* reply, long refcon);
  19. OSErr MyBuildLanguageModel (SRRecognitionSystem mySystem, SRLanguageModel * languageModel);
  20. void MyHandleRecognitionResult (SRRecognitionResult recResult);
  21.  
  22.  
  23. void MyInitSpeechRecognition (void)
  24. {
  25.     OSErr                        myErr = noErr;
  26.     
  27.     if (!MyHasSpeechRecognitionMgr())
  28.         myErr = true;
  29.     
  30.     /* Install AppleEvent handler so recognizer can send us speech-done AppleEvents. */
  31.     if (!myErr)
  32.         myErr = AEInstallEventHandler(kAESpeechSuite, kAESpeechDone,
  33.                 NewAEEventHandlerProc(MyHandleSpeechDoneAppleEvent), 0, false);
  34.  
  35.     if (!myErr)
  36.         myErr = SROpenRecognitionSystem (&gRecSystem, kSRDefaultRecognitionSystemID);
  37.     
  38.     if (!myErr)
  39.         {
  40.         short myModes = kSRHasFeedbackHasListenModes;
  41.         myErr = SRSetProperty (gRecSystem, kSRFeedbackAndListeningModes, 
  42.                                                     &myModes, sizeof (myModes));
  43.         }
  44.         
  45.     if (!myErr)
  46.         myErr = MyBuildLanguageModel (gRecSystem, &gLanguageModel);
  47.     
  48.     if (!myErr)
  49.         myErr = SRNewRecognizer (gRecSystem, &gRecognizer, kSRDefaultSpeechSource);
  50.     
  51.     if (!myErr)
  52.         myErr = SRSetLanguageModel (gRecognizer, gLanguageModel);
  53.     
  54.     if (!myErr)
  55.         myErr = SRStartListening (gRecognizer);
  56. }
  57.  
  58. void MyCleanupSpeechRecognition (void)
  59. {
  60.     OSErr                        myErr = noErr;
  61.  
  62.     if (gLanguageModel)
  63.         myErr = SRReleaseObject (gLanguageModel);
  64.     if (gRecognizer)
  65.         {
  66.         myErr = SRStopListening (gRecognizer);            /* stop processing incoming sound */
  67.         myErr = SRReleaseObject (gRecognizer);            /* balance SRNewRecognizer call */
  68.         }
  69.     if (gRecSystem)
  70.         myErr = SRCloseRecognitionSystem (gRecSystem);    /* balance SROpenRecognitionSystem call */
  71. }
  72.  
  73. Boolean MyHasSpeechRecognitionMgr (void)
  74. {
  75.     OSErr        myErr;
  76.     long        mySRVersion;
  77.     Boolean        myHasSRMgr = false;
  78.     
  79.     myErr = Gestalt (gestaltSpeechRecognitionVersion, &mySRVersion);
  80.     if (!myErr)
  81.         if (mySRVersion >= 0x0150)
  82.             myHasSRMgr = true;
  83.     
  84.     return myHasSRMgr;
  85. }
  86.  
  87. pascal OSErr MyHandleSpeechDoneAppleEvent (AppleEvent *theAEevt, AppleEvent* reply, long refcon)
  88. {
  89.     long                actualSize;
  90.     DescType            actualType;
  91.     OSErr                status = 0, recStatus = 0;
  92.     SRRecognitionResult    recResult = 0;
  93.     
  94.         /* Get status */
  95.     status = AEGetParamPtr (theAEevt, keySRSpeechStatus, typeShortInteger,
  96.                     &actualType, (Ptr)&recStatus, sizeof(status), &actualSize);
  97.  
  98.         /* Get result and handle it */
  99.     if (!status)
  100.         {
  101.         status = AEGetParamPtr(theAEevt,keySRSpeechResult,
  102.                     typeSRSpeechResult, &actualType, (Ptr)&recResult,
  103.                     sizeof(SRRecognitionResult), &actualSize);
  104.         
  105.         if (!recStatus)    
  106.             MyHandleRecognitionResult (recResult);
  107.         }
  108.  
  109.     return status;
  110. }
  111.  
  112. /* MyBuildLanguageModel creates language model for the following BNF:
  113.     <weapon> =    Bowie Knife | Forty-Four Pistol | Machine Gun | 
  114.                 Double Barrel Shotgun | Flame Thrower | Rocket launcher;
  115. */
  116. OSErr MyBuildLanguageModel (SRRecognitionSystem mySystem, SRLanguageModel * languageModel)
  117. {
  118.     OSErr            myErr = noErr;
  119.     SRLanguageModel    myWeaponLM = 0;
  120.     SRPath            myPath;
  121.     char **            myStringArray;
  122.     char *            myCurrString;
  123.     
  124.     // create an embedded language model named "<weapon>"    
  125.     if (!myErr) 
  126.         myErr = SRNewLanguageModel (mySystem, &myWeaponLM, "<weapon>", strlen("<weapon>"));
  127.     if (!myErr) 
  128.         myErr = SRSetProperty (myWeaponLM, kSRRefCon, &kWeaponLMRefCon, sizeof(kWeaponLMRefCon));
  129.     if (!myErr)
  130.         myErr = SRAddText (myWeaponLM, "Bowie Knife", strlen("Bowie Knife"), kKnife);
  131.     if (!myErr)
  132.         myErr = SRAddText (myWeaponLM, "Forty-Four Pistol", strlen("Forty-Four Pistol"), kPistol);
  133.     if (!myErr)
  134.         myErr = SRAddText (myWeaponLM, "Machine Gun", strlen("Machine Gun"), kMachineGun);
  135.     if (!myErr)
  136.         myErr = SRAddText (myWeaponLM, "Double Barrel Shotgun", strlen("Double Barrel Shotgun"), kShotgun);
  137.     if (!myErr)
  138.         myErr = SRAddText (myWeaponLM, "Flame Thrower", strlen("Flame Thrower"), kFlameThrower);
  139.     if (!myErr)
  140.         myErr = SRAddText (myWeaponLM, "Rocket launcher", strlen("Rocket launcher"), kRocketLauncher);
  141.     if (!myErr)
  142.         *languageModel = myWeaponLM;
  143.             
  144.     return myErr;
  145. }
  146.  
  147. void MyHandleRecognitionResult (SRRecognitionResult recResult)
  148. {
  149.     OSErr                myErr = noErr;
  150.  
  151.     if (recResult)
  152.         {
  153.         SRLanguageModel    myResultLM;
  154.         Size            myLen;
  155.         
  156.         myLen = sizeof (myResultLM);
  157.         myErr = SRGetProperty (recResult, kSRLanguageModelFormat, &myResultLM, &myLen);
  158.         
  159.         if (!myErr)    
  160.             {
  161.             long     myRefCon;
  162.             
  163.             myLen = sizeof (myRefCon);
  164.             myErr = SRGetProperty (myResultLM, kSRRefCon, &myRefCon, &myLen);
  165.             
  166.             /*    if it's a valid result from our weapon LM,             */
  167.             /*    then parse and process its elements                 */
  168.             if (!myErr && myRefCon == kWeaponLMRefCon)
  169.                 {
  170.                 SRLanguageObject    mySubElement;
  171.                 
  172.                 /* weapon LM just a list of weapons:                 */
  173.                 
  174.                 /* we get the first sub-element (there will only be one, the phrase) */
  175.                 myErr = SRGetIndexedItem (myResultLM, &mySubElement, 0);
  176.                 if (!myErr)
  177.                     {
  178.                     myLen = sizeof (myRefCon);
  179.                     myErr = SRGetProperty (mySubElement, kSRRefCon, &myRefCon, &myLen);
  180.                     
  181.                     /* we previously set the refcon to the weapon ID */
  182.                     SetWeapon (myRefCon);
  183.                     
  184.                     /* release subelement when done with it         */
  185.                     myErr = SRReleaseObject (mySubElement);
  186.                     }
  187.                 }
  188.             
  189.             //    release myResultLM fetched above when done with it
  190.             myErr = SRReleaseObject (myResultLM);
  191.             }
  192.         
  193.         /* Release SRRecognitionResult since we are done with it                 */
  194.         /*    The toolbox has given us a reference to this object, and        */
  195.         /*    assumes we are still using it until we call SRReleaseObject        */
  196.         /*    with it.                                                        */
  197.         myErr = SRReleaseObject (recResult);
  198.         }
  199.     
  200. }
  201.  
  202.  
  203.  
  204.